//app.js
App({
  /**
     * 设置监听器
     */
  setWatcher(page) {
    let data = page.data;
    let watch = page.watch;
    Object.keys(watch).forEach(v => {
        let key = v.split('.'); // 将watch中的属性以'.'切分成数组
        let nowData = data; // 将data赋值给nowData
        for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素，除了最后一个！
            nowData = nowData[key[i]]; // 将nowData指向它的key属性对象
        }
        let lastKey = key[key.length - 1];
        // 假设key==='my.name',此时nowData===data['my']===data.my,lastKey==='name'
        let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法
        let deep = watch[v].deep; // 若未设置deep,则为undefine
        this.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey
    })
  },
  /**
  * 监听属性 并执行监听函数
  */
  observe(obj, key, watchFun, deep, page) {
    var val = obj[key];
    // 判断deep是true 且 val不能为空 且 typeof val==='object'（数组内数值变化也需要深度监听）
    if (deep && val != null && typeof val === 'object') { 
        Object.keys(val).forEach(childKey=>{ // 遍历val对象下的每一个key
            this.observe(val,childKey,watchFun,deep,page); // 递归调用监听函数
        })
    }
    var that = this;
    Object.defineProperty(obj, key, {
        configurable: true,
        enumerable: true,
        set: function(value) {
            // 用page对象调用,改变函数内this指向,以便this.data访问data内的属性值
            watchFun.call(page,value,val); // value是新值，val是旧值
            val = value;
            if(deep){ // 若是深度监听,重新监听该对象，以便监听其属性。
                that.observe(obj, key, watchFun, deep, page); 
            }
        },
        get: function() {
            return val;
        }
    })
  },
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo
              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null,
    form:[
      {"name":"姓名", "id": "name", "value": "嬴政", "type":"input"},
      {"name":"职务", "id": "duty", "value": "皇帝", "type":"input"},
      {"name":"公司名", "id": "company", "value": "大秦王朝", "type":"input"},
      {"name":"个人介绍", "id": "intro", "value": "统一六国；南平百越，北击匈奴；建立皇帝制度；修建万里长城", "type":"input"},
      {"name":"电话", "id": "phone", "value": "8888888", "type":"input"},
      {"name":"邮箱", "id": "email", "value": "305694695@qq.com", "type":"input"},
      {"name":"公司地址", "id": "addr", "value": "河北邯郸", "type":"input"},
      {"name":"公司商标", "id": "logo", "value": "http://img.tstin.com/logo.png", "type":"image"},
      // {"name":"头像", "id": "avatar", "value": "cloud://tstin.7473-tstin-1301705330/avatar-0.png", "type":"image"},
      {"name":"二维码", "id": "qrcode", "value": "http://img.tstin.com/qrcode.jpg", "type":"image"}
  ]
  }
})